const User = require('../../model/User')
const User_img = require('../../model/User_Img')
const jwt = require('jsonwebtoken')
const config = require('config').get('web')
const moment = require('moment')
moment.locale('zh-cn')
    // 导入生存随机数模块
const stringRandom = require('string-random');
// 操作路径模块
const path = require('path')
    // 操作文件模块
const fs = require('fs')
    // 引入formidable
const formidable = require('formidable');
module.exports = (req, res) => {
    // 创建表单解析对象
    const form = new formidable.IncomingForm()
        // 是否保留表单上传文件的后缀名 默认是false
    form.keepExtensions = true
        // 存储文件夹名字，默认是 uploads
    var isfolder = 'uploads'
        // 接收客户端传递过来的token
    const token = String(req.headers.authorization)
        // 解析
    const username = jwt.decode(token, 'xiaoke')
        // 判断是否传递 token 和 判断 token 是否 正确
        // 没有传递
        // 设置文件存储位置
    form.uploadDir = path.join(__dirname, '../', '../', 'public', isfolder)
    if (token == 'undefined' || username == null) {
        isfolder = 'uploads'
            // 设置文件存储位置
        form.uploadDir = path.join(__dirname, '../', '../', 'public', isfolder)

    }
    // 传递了
    else {
        // 存储文件夹的名字 修改 为 用户的用户名
        isfolder = username.username
        form.uploadDir = path.join(__dirname, '../', '../', 'public', isfolder)
            // 读取文件夹
        fs.readdir(path.join(__dirname, '../', '../', 'public'), (err, files) => {
            // 循环文件夹名
            for (var i = 0; i < files.length; i++) {
                // console.log(files[i]);
                // 判断文件夹是否存储
                // 存在
                if (files[i] == username.username) {
                    form.uploadDir = path.join(__dirname, '../', '../', 'public', isfolder)
                    return
                }
            }
            // 文件不存在
            // 重新创建
            fs.mkdir(path.join(__dirname, '../', '../', 'public', username.username), (err) => {
                if (err) {
                    console.log(err);
                    return
                }
                // 设置文件上传的路径
                form.uploadDir = path.join(__dirname, '../', '../', 'public', isfolder)
            })
        })
    }
    // 对表单进行解析
    form.parse(req, async(err, fields, files) => {
        //拿到扩展名
        const extname = path.extname(files['file'].name)
            // 旧的路径
        const oldpath = files['file'].path
            // 新的路径
        const newpath = path.join(__dirname, '../', '../', 'public', isfolder, stringRandom(10) + extname)
        console.log(newpath);
        let size = files['file'].size / 1024
        size = size.toFixed(2)
        if ((size / 1024).toFixed(2) > 10) {
            res.sendResult(null, 400, '文件大小超出系统设定大小！')
                // 删除
            fs.unlink(oldpath, (err) => {
                if (err) {
                    throw err;
                }
            })
            return
        }


        // 正则表达式
        var reg = /(.*)\.(jpg|bmp|gif|ico|pcx|jpeg|tif|png|raw|tga)$/;
        // 判断上传的图片类型是否合格
        if (!reg.test(extname)) {
            res.sendResult(null, 400, '图片格式不合格！')
                // 删除
            fs.unlink(oldpath, (err) => {
                if (err) {
                    throw err;
                }
            })
            return
        }
        // 将文件名称修改为 随机生存的字符串
        fs.rename(oldpath, newpath, function(err) {
            if (err) {
                throw Error('改名失败' + err);
            }
        });
        // 判断是否用户已经登陆并上传图片
        if (isfolder != 'uploads') {
            // 根据 用户名 查询用户
            const isusername = await User.findOne({ where: { username: username.username } })
                // isusername.capacity
            let issize = (size / 1024).toFixed(2)
            issize = isusername.capacity - issize
            if (issize < 0) {
                fs.unlink(newpath, (err) => {
                    if (err) {
                        throw err;
                    }
                    console.log('容量不够删除文件成功！');
                })
                res.sendResult(null, 400, '用户的容量不够！')
                return
            }
            // 创建图片对象
            var obj = {
                    user_id: isusername.id,
                    img_name: stringRandom(10) + path.extname(files['file'].name),
                    img_path: newpath.replace(/\\/g, "/").split('public')[1],
                    img_size: size,
                    img_data: moment().format('YYYY-MM-DD HH:mm:ss'),
                    img_url: config.domainName + newpath.replace(/\\/g, "/").split('public')[1]
                }
                // 添加到数据库
            const createUser_img = await User_img.create(obj)
            if (!createUser_img) {
                res.sendResult(null, 422, '创建失败')
                return
            }
            const editSize = await User.update({ capacity: issize }, { where: { id: isusername.id } })
            if (!editSize) {
                res.sendResult(null, 422, '发生未知错误！')
                return
            }
        }
        res.sendResult({
            name: stringRandom(10) + path.extname(files['file'].name),
            path: newpath.replace(/\\/g, "/").split('public')[1],
            url: config.domainName + newpath.replace(/\\/g, "/").split('public')[1],
            size: size + 'kb',
        }, 200, '上传成功！')
    })
}